java 基础知识 动态代理 jdk代理
一、jdk动态代理
动态代理分为jdk动态代理和cglib动态代理,本章讲解jdk动态代理
二、jdk动态代理如何实现
- 实现InvorcationHander接口,在invoke()方法实现增强
- 通过Proxy.newProxyInstance()方法获取到代理类
- 调用代理引用调用目标方法实现曾江
三、代码实现
结果:1
2
3
4
5
6
7
8
9
10
11
12public static void main(String[] args) {
final Car car = new BmwCar();
Car carProxy = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(), car.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("增强前");
Object invoke = method.invoke(car, args);
System.out.println("增强后");
return invoke;
}
});
carProxy.run();
}四、实现原理
可以看到通过Proxy.newProxyInstance()生成了目标对象的代理类,以二进制的方式加载到了内存中.
那么代理类长什么样子呢? - 代理类继承了Proxy类并且实现了我们的car接口
- 在实现的run方法中,调用了h.invoke()方法
- 那么h是什么呢? h是 Proxy类中的属性,就是InvoketionHander接口的引用,所以jdk代理类必须实现InvoketionHander接口
jdk 动态代理实现图
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment